This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter. # Cellchat

source("./tianfengRwrappers.R")
library(CellChat)

CellChat

配体-受体+辅因子

#推断细胞间通信网络,不要使用并行计算!
cor <- computeCommunProb(cor)

  |                                                                                                          
  |                                                                                                    |   0%
  |                                                                                                          
  |=                                                                                                   |   1%
  |                                                                                                          
  |==                                                                                                  |   2%
  |                                                                                                          
  |===                                                                                                 |   3%
  |                                                                                                          
  |====                                                                                                |   4%
  |                                                                                                          
  |=====                                                                                               |   5%
  |                                                                                                          
  |======                                                                                              |   6%
  |                                                                                                          
  |=======                                                                                             |   7%
  |                                                                                                          
  |========                                                                                            |   8%
  |                                                                                                          
  |=========                                                                                           |   9%
  |                                                                                                          
  |==========                                                                                          |  10%
  |                                                                                                          
  |===========                                                                                         |  11%
  |                                                                                                          
  |============                                                                                        |  12%
  |                                                                                                          
  |=============                                                                                       |  13%
  |                                                                                                          
  |==============                                                                                      |  14%
  |                                                                                                          
  |===============                                                                                     |  15%
  |                                                                                                          
  |================                                                                                    |  16%
  |                                                                                                          
  |=================                                                                                   |  17%
  |                                                                                                          
  |==================                                                                                  |  18%
  |                                                                                                          
  |===================                                                                                 |  19%
  |                                                                                                          
  |====================                                                                                |  20%
  |                                                                                                          
  |=====================                                                                               |  21%
  |                                                                                                          
  |======================                                                                              |  22%
  |                                                                                                          
  |=======================                                                                             |  23%
  |                                                                                                          
  |========================                                                                            |  24%
  |                                                                                                          
  |=========================                                                                           |  25%
  |                                                                                                          
  |==========================                                                                          |  26%
  |                                                                                                          
  |===========================                                                                         |  27%
  |                                                                                                          
  |============================                                                                        |  28%
  |                                                                                                          
  |=============================                                                                       |  29%
  |                                                                                                          
  |==============================                                                                      |  30%
  |                                                                                                          
  |===============================                                                                     |  31%
  |                                                                                                          
  |================================                                                                    |  32%
  |                                                                                                          
  |=================================                                                                   |  33%
  |                                                                                                          
  |==================================                                                                  |  34%
  |                                                                                                          
  |===================================                                                                 |  35%
  |                                                                                                          
  |====================================                                                                |  36%
  |                                                                                                          
  |=====================================                                                               |  37%
  |                                                                                                          
  |======================================                                                              |  38%
  |                                                                                                          
  |=======================================                                                             |  39%
  |                                                                                                          
  |========================================                                                            |  40%
  |                                                                                                          
  |=========================================                                                           |  41%
  |                                                                                                          
  |==========================================                                                          |  42%
  |                                                                                                          
  |===========================================                                                         |  43%
  |                                                                                                          
  |============================================                                                        |  44%
  |                                                                                                          
  |=============================================                                                       |  45%
  |                                                                                                          
  |==============================================                                                      |  46%
  |                                                                                                          
  |===============================================                                                     |  47%
  |                                                                                                          
  |================================================                                                    |  48%
  |                                                                                                          
  |=================================================                                                   |  49%
  |                                                                                                          
  |==================================================                                                  |  50%
  |                                                                                                          
  |===================================================                                                 |  51%
  |                                                                                                          
  |====================================================                                                |  52%
  |                                                                                                          
  |=====================================================                                               |  53%
  |                                                                                                          
  |======================================================                                              |  54%
  |                                                                                                          
  |=======================================================                                             |  55%
  |                                                                                                          
  |========================================================                                            |  56%
  |                                                                                                          
  |=========================================================                                           |  57%
  |                                                                                                          
  |==========================================================                                          |  58%
  |                                                                                                          
  |===========================================================                                         |  59%
  |                                                                                                          
  |============================================================                                        |  60%
  |                                                                                                          
  |=============================================================                                       |  61%
  |                                                                                                          
  |==============================================================                                      |  62%
  |                                                                                                          
  |===============================================================                                     |  63%
  |                                                                                                          
  |================================================================                                    |  64%
  |                                                                                                          
  |=================================================================                                   |  65%
  |                                                                                                          
  |==================================================================                                  |  66%
  |                                                                                                          
  |===================================================================                                 |  67%
  |                                                                                                          
  |====================================================================                                |  68%
  |                                                                                                          
  |=====================================================================                               |  69%
  |                                                                                                          
  |======================================================================                              |  70%
  |                                                                                                          
  |=======================================================================                             |  71%
  |                                                                                                          
  |========================================================================                            |  72%
  |                                                                                                          
  |=========================================================================                           |  73%
  |                                                                                                          
  |==========================================================================                          |  74%
  |                                                                                                          
  |===========================================================================                         |  75%
  |                                                                                                          
  |============================================================================                        |  76%
  |                                                                                                          
  |=============================================================================                       |  77%
  |                                                                                                          
  |==============================================================================                      |  78%
  |                                                                                                          
  |===============================================================================                     |  79%
  |                                                                                                          
  |================================================================================                    |  80%
  |                                                                                                          
  |=================================================================================                   |  81%
  |                                                                                                          
  |==================================================================================                  |  82%
  |                                                                                                          
  |===================================================================================                 |  83%
  |                                                                                                          
  |====================================================================================                |  84%
  |                                                                                                          
  |=====================================================================================               |  85%
  |                                                                                                          
  |======================================================================================              |  86%
  |                                                                                                          
  |=======================================================================================             |  87%
  |                                                                                                          
  |========================================================================================            |  88%
  |                                                                                                          
  |=========================================================================================           |  89%
  |                                                                                                          
  |==========================================================================================          |  90%
  |                                                                                                          
  |===========================================================================================         |  91%
  |                                                                                                          
  |============================================================================================        |  92%
  |                                                                                                          
  |=============================================================================================       |  93%
  |                                                                                                          
  |==============================================================================================      |  94%
  |                                                                                                          
  |===============================================================================================     |  95%
  |                                                                                                          
  |================================================================================================    |  96%
  |                                                                                                          
  |=================================================================================================   |  97%
  |                                                                                                          
  |==================================================================================================  |  98%
  |                                                                                                          
  |=================================================================================================== |  99%
  |                                                                                                          
  |====================================================================================================| 100%
#推断细胞间通信网络,不要使用并行计算!
cor <- computeCommunProb(cor)

  |                                                                                                          
  |                                                                                                    |   0%
  |                                                                                                          
  |=                                                                                                   |   1%
  |                                                                                                          
  |==                                                                                                  |   2%
  |                                                                                                          
  |===                                                                                                 |   3%
  |                                                                                                          
  |====                                                                                                |   4%
  |                                                                                                          
  |=====                                                                                               |   5%
  |                                                                                                          
  |======                                                                                              |   6%
  |                                                                                                          
  |=======                                                                                             |   7%
  |                                                                                                          
  |========                                                                                            |   8%
  |                                                                                                          
  |=========                                                                                           |   9%
  |                                                                                                          
  |==========                                                                                          |  10%
  |                                                                                                          
  |===========                                                                                         |  11%
  |                                                                                                          
  |============                                                                                        |  12%
  |                                                                                                          
  |=============                                                                                       |  13%
  |                                                                                                          
  |==============                                                                                      |  14%
  |                                                                                                          
  |===============                                                                                     |  15%
  |                                                                                                          
  |================                                                                                    |  16%
  |                                                                                                          
  |=================                                                                                   |  17%
  |                                                                                                          
  |==================                                                                                  |  18%
  |                                                                                                          
  |===================                                                                                 |  19%
  |                                                                                                          
  |====================                                                                                |  20%
  |                                                                                                          
  |=====================                                                                               |  21%
  |                                                                                                          
  |======================                                                                              |  22%
  |                                                                                                          
  |=======================                                                                             |  23%
  |                                                                                                          
  |========================                                                                            |  24%
  |                                                                                                          
  |=========================                                                                           |  25%
  |                                                                                                          
  |==========================                                                                          |  26%
  |                                                                                                          
  |===========================                                                                         |  27%
  |                                                                                                          
  |============================                                                                        |  28%
  |                                                                                                          
  |=============================                                                                       |  29%
  |                                                                                                          
  |==============================                                                                      |  30%
  |                                                                                                          
  |===============================                                                                     |  31%
  |                                                                                                          
  |================================                                                                    |  32%
  |                                                                                                          
  |=================================                                                                   |  33%
  |                                                                                                          
  |==================================                                                                  |  34%
  |                                                                                                          
  |===================================                                                                 |  35%
  |                                                                                                          
  |====================================                                                                |  36%
  |                                                                                                          
  |=====================================                                                               |  37%
  |                                                                                                          
  |======================================                                                              |  38%
  |                                                                                                          
  |=======================================                                                             |  39%
  |                                                                                                          
  |========================================                                                            |  40%
  |                                                                                                          
  |=========================================                                                           |  41%
  |                                                                                                          
  |==========================================                                                          |  42%
  |                                                                                                          
  |===========================================                                                         |  43%
  |                                                                                                          
  |============================================                                                        |  44%
  |                                                                                                          
  |=============================================                                                       |  45%
  |                                                                                                          
  |==============================================                                                      |  46%
  |                                                                                                          
  |===============================================                                                     |  47%
  |                                                                                                          
  |================================================                                                    |  48%
  |                                                                                                          
  |=================================================                                                   |  49%
  |                                                                                                          
  |==================================================                                                  |  50%
  |                                                                                                          
  |===================================================                                                 |  51%
  |                                                                                                          
  |====================================================                                                |  52%
  |                                                                                                          
  |=====================================================                                               |  53%
  |                                                                                                          
  |======================================================                                              |  54%
  |                                                                                                          
  |=======================================================                                             |  55%
  |                                                                                                          
  |========================================================                                            |  56%
  |                                                                                                          
  |=========================================================                                           |  57%
  |                                                                                                          
  |==========================================================                                          |  58%
  |                                                                                                          
  |===========================================================                                         |  59%
  |                                                                                                          
  |============================================================                                        |  60%
  |                                                                                                          
  |=============================================================                                       |  61%
  |                                                                                                          
  |==============================================================                                      |  62%
  |                                                                                                          
  |===============================================================                                     |  63%
  |                                                                                                          
  |================================================================                                    |  64%
  |                                                                                                          
  |=================================================================                                   |  65%
  |                                                                                                          
  |==================================================================                                  |  66%
  |                                                                                                          
  |===================================================================                                 |  67%
  |                                                                                                          
  |====================================================================                                |  68%
  |                                                                                                          
  |=====================================================================                               |  69%
  |                                                                                                          
  |======================================================================                              |  70%
  |                                                                                                          
  |=======================================================================                             |  71%
  |                                                                                                          
  |========================================================================                            |  72%
  |                                                                                                          
  |=========================================================================                           |  73%
  |                                                                                                          
  |==========================================================================                          |  74%
  |                                                                                                          
  |===========================================================================                         |  75%
  |                                                                                                          
  |============================================================================                        |  76%
  |                                                                                                          
  |=============================================================================                       |  77%
  |                                                                                                          
  |==============================================================================                      |  78%
  |                                                                                                          
  |===============================================================================                     |  79%
  |                                                                                                          
  |================================================================================                    |  80%
  |                                                                                                          
  |=================================================================================                   |  81%
  |                                                                                                          
  |==================================================================================                  |  82%
  |                                                                                                          
  |===================================================================================                 |  83%
  |                                                                                                          
  |====================================================================================                |  84%
  |                                                                                                          
  |=====================================================================================               |  85%
  |                                                                                                          
  |======================================================================================              |  86%
  |                                                                                                          
  |=======================================================================================             |  87%
  |                                                                                                          
  |========================================================================================            |  88%
  |                                                                                                          
  |=========================================================================================           |  89%
  |                                                                                                          
  |==========================================================================================          |  90%
  |                                                                                                          
  |===========================================================================================         |  91%
  |                                                                                                          
  |============================================================================================        |  92%
  |                                                                                                          
  |=============================================================================================       |  93%
  |                                                                                                          
  |==============================================================================================      |  94%
  |                                                                                                          
  |===============================================================================================     |  95%
  |                                                                                                          
  |================================================================================================    |  96%
  |                                                                                                          
  |=================================================================================================   |  97%
  |                                                                                                          
  |==================================================================================================  |  98%
  |                                                                                                          
  |=================================================================================================== |  99%
  |                                                                                                          
  |====================================================================================================| 100%
#若细胞群中只有少数细胞出现联系(<10个),则过滤掉它们
cor <- filterCommunication(cor,min.cells = 10)
#提取表达网络矩阵
df.net <- subsetCommunication(cor)
#推断信号通路
cor <- computeCommunProbPathway(cor)
#合并通信网络数据
cor <- aggregateNet(cor)
write.csv(df.net,"./datatable/cellchat_res.csv", row.names = F)

cellchat可视化

cor <- readRDS("CA2_cellchat.rds")

# cor@idents <- plyr::revalue(cor@idents, c("Mod_SMC"="Fibroblast", "SMC_0"="SMC1","SMC_1"="Fibromyocyte",
#                    "SMC_2"="Pericyte","SMC_3"="SMC2"))

table(cor@idents)

             SMC1      Fibromyocyte          Pericyte              SMC2                EC                FB 
             3430              2294              1590              1021              6092              1224 
       Macrophage            T cell           NK cell Neural progenitor            B cell         Mast cell 
             9832             12245              4125               366              2206               430 
groupSize <- as.numeric(table(cor@idents))
netVisual_circle(cor@net$weight, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Interaction weights/strength")

netVisual_heatmap(cor, measure = "weight", signaling = NULL, color.heatmap = c("#f1f1f1", "#ff2121"))
Do heatmap based on a single object 

#一次分析不同细胞亚群
mat <- cor@net$weight
for (i in 1:nrow(mat)) {
  mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
  mat2[i, ] <- mat[i, ]
  netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, edge.weight.max = max(mat), title.name = rownames(mat)[i])
}


# pheatmap(mat, display_numbers = FALSE, number_color ="black", cluster_rows = FALSE, 
         # cluster_cols = FALSE, color = colorRampPalette(c("#1E90FF", "white", "#ff2121"))(400), border_color = NA)
table(cor@idents)

             SMC1      Fibromyocyte          Pericyte              SMC2                EC                FB 
             3430              2294              1590              1021              6092              1224 
       Macrophage            T cell           NK cell Neural progenitor            B cell         Mast cell 
             9832             12245              4125               366              2206               430 
netVisual_chord_gene(cor, sources.use = c(4), targets.use = c(1:12), lab.cex = 0.5, legend.pos.y = 30)


netVisual_chord_gene(cor, sources.use = c(1:12), targets.use = c(4), lab.cex = 0.5, legend.pos.y = 30)

#指定pathway
pathways.show <- c("TGFb") #SMC2
# Hierarchy plot
vertex.receiver = c(2,3,6,7,13) # a numeric vector. 
netVisual_aggregate(cor, signaling = pathways.show, layout = "hierarchy", vertex.receiver = vertex.receiver)
netVisual_aggregate(cor, signaling = pathways.show, layout = "circle")
# netVisual_aggregate(cor, signaling = pathways.show, layout = "chord")

# Heatmap
netVisual_heatmap(cor, signaling = pathways.show, color.heatmap = c("#f1f1f1", "#ff2121"))
#可视化单个配体受体对的影响
netAnalysis_contribution(cor, signaling = pathways.show)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAojIENlbGxjaGF0CmBgYHtyfQpzb3VyY2UoIi4vdGlhbmZlbmdSd3JhcHBlcnMuUiIpCmxpYnJhcnkoQ2VsbENoYXQpCmBgYAoKCmBgYHtyfQpkczIgPC0gcmVhZFJEUygiZHMyLnJkcyIpCkNBX2RhdGFzZXQyIDwtIHJlYWRSRFMoIkNBX2RhdGFzZXQyLnJkcyIpCiMgc2F2ZVJEUyhDQV9kYXRhc2V0MiwiQ0FfZGF0YXNldDIucmRzIikKdW1hcHBsb3QoQ0FfZGF0YXNldDIpCmBgYAoKYGBge3J9CklkZW50cyhDQV9kYXRhc2V0MikgPC0gQ0FfZGF0YXNldDIkQ2xhc3NpZmljYXRpb24xCkNBX2RhdGFzZXQyIDwtIEZpbmRTdWJDbHVzdGVyKENBX2RhdGFzZXQyLCBjbHVzdGVyID0gJ1NNQycsIGdyYXBoLm5hbWUgPSAnU0NUX3NubicscmVzb2x1dGlvbiA9IDAuMTUgKQpJZGVudHMoQ0FfZGF0YXNldDIpIDwtIENBX2RhdGFzZXQyJHN1Yi5jbHVzdGVyCgpDQV9kYXRhc2V0MiA8LSBSZW5hbWVJZGVudHMoQ0FfZGF0YXNldDIsICJNb2RfU01DIj0iRmlicm9ibGFzdCIsICJTTUNfMCI9IlNNQzEiLCJTTUNfMSI9IkZpYnJvbXlvY3l0ZSIsCiAgICAgICAgICAgICAgICAgICAiU01DXzIiPSJQZXJpY3l0ZSIsIlNNQ18zIj0iU01DMiIpCnVtYXBwbG90KENBX2RhdGFzZXQyKQpmKCJETFg2LUFTMSIsQ0FfZGF0YXNldDIpCmBgYAoKIyBDZWxsQ2hhdAojIyDphY3kvZMt5Y+X5L2TK+i+heWboOWtkApgYGB7cn0KY29yIDwtIGNyZWF0ZUNlbGxDaGF0KENBX2RhdGFzZXQyKQpjZWxsY2hhdERCIDwtIENlbGxDaGF0REIuaHVtYW4KCnNob3dEYXRhYmFzZUNhdGVnb3J5KGNlbGxjaGF0REIpCiNjZWxsY2hhdERCX3VzZSA8LSBzdWJzZXREQihjZWxsY2hhdERCLCBzZWFyY2ggPSAiU2VjcmV0ZWQgU2lnbmFsaW5nIikgICPkvb/nlKjnibnlrprnsbvlnovnmoTphY3kvZPlj5fkvZPnm7jkupLlhbPns7sKCiPmjIflrprliIbmnpDkvb/nlKjnmoRkYXRhYmFzZQpjb3JAREIgPC0gY2VsbGNoYXREQgoKI+iKguecgeiuoeeul+aIkOacrApjb3IgPC0gc3Vic2V0RGF0YShjb3IpCgpjb3IgPC0gaWRlbnRpZnlPdmVyRXhwcmVzc2VkR2VuZXMoY29yKQpjb3IgPC0gaWRlbnRpZnlPdmVyRXhwcmVzc2VkSW50ZXJhY3Rpb25zKGNvcikKCiPkvb/nlKjom4vnmb3otKjkupLkvZznvZHnu5zvvIzmoLnmja7ln7rlm6Dpl7Tnm7jkupLlhbPns7vooaXlhYXooajovr7ph48KY29yIDwtIHByb2plY3REYXRhKGNvciwgUFBJLmh1bWFuKQoKI+aOqOaWree7huiDnumXtOmAmuS/oee9kee7nO+8jOS4jeimgeS9v+eUqOW5tuihjOiuoeeul++8gQpjb3IgPC0gY29tcHV0ZUNvbW11blByb2IoY29yKQoj6Iul57uG6IOe576k5Lit5Y+q5pyJ5bCR5pWw57uG6IOe5Ye6546w6IGU57O7KDwxMOS4qinvvIzliJnov4fmu6TmjonlroPku6wKY29yIDwtIGZpbHRlckNvbW11bmljYXRpb24oY29yLG1pbi5jZWxscyA9IDEwKQoKI+aPkOWPluihqOi+vue9kee7nOefqemYtQpkZi5uZXQgPC0gc3Vic2V0Q29tbXVuaWNhdGlvbihjb3IpCiNkZi5uZXQgPC0gc3Vic2V0Q29tbXVuaWNhdGlvbihjb3Isc291cmNlLnVzZSA9IGMoNSksIHRhcmdldC51c2UgPSBjKDQpLCBzaWduYWxpbmcgPSBjKCJXTlQiKSkgI+aMh+WumuWIhuaekOeahOmAmui3r+WSjOe7huiDnuexu+e+pAoKI+aOqOaWreS/oeWPt+mAmui3rwpjb3IgPC0gY29tcHV0ZUNvbW11blByb2JQYXRod2F5KGNvcikKCiPlkIjlubbpgJrkv6HnvZHnu5zmlbDmja4KY29yIDwtIGFnZ3JlZ2F0ZU5ldChjb3IpCnNhdmVSRFMoY29yLCJDQTJfY2VsbGNoYXQucmRzIikKYGBgCmBgYHtyfQp3cml0ZS5jc3YoZGYubmV0LCIuL2RhdGF0YWJsZS9jZWxsY2hhdF9yZXMuY3N2Iiwgcm93Lm5hbWVzID0gRikKYGBgCgoKCiMjIGNlbGxjaGF05Y+v6KeG5YyWCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9Nn0KY29yIDwtIHJlYWRSRFMoIkNBMl9jZWxsY2hhdC5yZHMiKQoKIyBjb3JAaWRlbnRzIDwtIHBseXI6OnJldmFsdWUoY29yQGlkZW50cywgYygiTW9kX1NNQyI9IkZpYnJvYmxhc3QiLCAiU01DXzAiPSJTTUMxIiwiU01DXzEiPSJGaWJyb215b2N5dGUiLAojICAgICAgICAgICAgICAgICAgICAiU01DXzIiPSJQZXJpY3l0ZSIsIlNNQ18zIj0iU01DMiIpKQoKdGFibGUoY29yQGlkZW50cykKZ3JvdXBTaXplIDwtIGFzLm51bWVyaWModGFibGUoY29yQGlkZW50cykpCm5ldFZpc3VhbF9jaXJjbGUoY29yQG5ldCR3ZWlnaHQsIHZlcnRleC53ZWlnaHQgPSBncm91cFNpemUsIHdlaWdodC5zY2FsZSA9IFQsIGxhYmVsLmVkZ2U9IEYsIHRpdGxlLm5hbWUgPSAiSW50ZXJhY3Rpb24gd2VpZ2h0cy9zdHJlbmd0aCIpCm5ldFZpc3VhbF9oZWF0bWFwKGNvciwgbWVhc3VyZSA9ICJ3ZWlnaHQiLCBzaWduYWxpbmcgPSBOVUxMLCBjb2xvci5oZWF0bWFwID0gYygiI2YxZjFmMSIsICIjZmYyMTIxIikpCgoj5LiA5qyh5YiG5p6Q5LiN5ZCM57uG6IOe5Lqa576kCm1hdCA8LSBjb3JAbmV0JHdlaWdodApmb3IgKGkgaW4gMTpucm93KG1hdCkpIHsKICBtYXQyIDwtIG1hdHJpeCgwLCBucm93ID0gbnJvdyhtYXQpLCBuY29sID0gbmNvbChtYXQpLCBkaW1uYW1lcyA9IGRpbW5hbWVzKG1hdCkpCiAgbWF0MltpLCBdIDwtIG1hdFtpLCBdCiAgbmV0VmlzdWFsX2NpcmNsZShtYXQyLCB2ZXJ0ZXgud2VpZ2h0ID0gZ3JvdXBTaXplLCB3ZWlnaHQuc2NhbGUgPSBULCBlZGdlLndlaWdodC5tYXggPSBtYXgobWF0KSwgdGl0bGUubmFtZSA9IHJvd25hbWVzKG1hdClbaV0pCn0KCiMgcGhlYXRtYXAobWF0LCBkaXNwbGF5X251bWJlcnMgPSBGQUxTRSwgbnVtYmVyX2NvbG9yID0iYmxhY2siLCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgICMgY2x1c3Rlcl9jb2xzID0gRkFMU0UsIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCIjMUU5MEZGIiwgIndoaXRlIiwgIiNmZjIxMjEiKSkoNDAwKSwgYm9yZGVyX2NvbG9yID0gTkEpCnRhYmxlKGNvckBpZGVudHMpCmBgYAoKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD02fQpuZXRWaXN1YWxfY2hvcmRfZ2VuZShjb3IsIHNvdXJjZXMudXNlID0gYyg0KSwgdGFyZ2V0cy51c2UgPSBjKDE6MTIpLCBsYWIuY2V4ID0gMC41LCBsZWdlbmQucG9zLnkgPSAzMCkKCm5ldFZpc3VhbF9jaG9yZF9nZW5lKGNvciwgc291cmNlcy51c2UgPSBjKDE6MTIpLCB0YXJnZXRzLnVzZSA9IGMoNCksIGxhYi5jZXggPSAwLjUsIGxlZ2VuZC5wb3MueSA9IDMwKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTZ9CiPmjIflrppwYXRod2F5CnBhdGh3YXlzLnNob3cgPC0gYygiVEdGYiIpICNTTUMyCiMgSGllcmFyY2h5IHBsb3QKdmVydGV4LnJlY2VpdmVyID0gYygyLDMsNiw3LDEzKSAjIGEgbnVtZXJpYyB2ZWN0b3IuIApuZXRWaXN1YWxfYWdncmVnYXRlKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgbGF5b3V0ID0gImhpZXJhcmNoeSIsIHZlcnRleC5yZWNlaXZlciA9IHZlcnRleC5yZWNlaXZlcikKbmV0VmlzdWFsX2FnZ3JlZ2F0ZShjb3IsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIGxheW91dCA9ICJjaXJjbGUiKQojIG5ldFZpc3VhbF9hZ2dyZWdhdGUoY29yLCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBsYXlvdXQgPSAiY2hvcmQiKQoKIyBIZWF0bWFwCm5ldFZpc3VhbF9oZWF0bWFwKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgY29sb3IuaGVhdG1hcCA9IGMoIiNmMWYxZjEiLCAiI2ZmMjEyMSIpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTZ9CiPlj6/op4bljJbljZXkuKrphY3kvZPlj5fkvZPlr7nnmoTlvbHlk40KbmV0QW5hbHlzaXNfY29udHJpYnV0aW9uKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdykKcGFpckxSLlRORiA8LSBleHRyYWN0RW5yaWNoZWRMUihjb3IsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIGdlbmVMUi5yZXR1cm4gPSBGQUxTRSkKTFIuc2hvdyA8LSBwYWlyTFIuVE5GWzEsXSAjIHNob3cgb25lIGxpZ2FuZC1yZWNlcHRvciBwYWlyIFRORjEyX0NYQ1I0CiMgSGllcmFyY2h5IHBsb3QKCm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdyxsYXlvdXQgPSAiaGllcmFyY2h5IiwgIHBhaXJMUi51c2UgPSBMUi5zaG93LCB2ZXJ0ZXgucmVjZWl2ZXIgPSB2ZXJ0ZXgucmVjZWl2ZXIpCm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgcGFpckxSLnVzZSA9IExSLnNob3csIGxheW91dCA9ICJjaXJjbGUiKQpuZXRWaXN1YWxfaW5kaXZpZHVhbChjb3IsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIHBhaXJMUi51c2UgPSBMUi5zaG93LCBsYXlvdXQgPSAiY2hvcmQiKQoKCgojIExSLnNob3cgPC0gcGFpckxSLlRORls0LF0gIyBzaG93IG9uZSBsaWdhbmQtcmVjZXB0b3IgcGFpciBUTkYxMl9DWENSNAojIEhpZXJhcmNoeSBwbG90Cm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdyxsYXlvdXQgPSAiaGllcmFyY2h5IiwgIHBhaXJMUi51c2UgPSBMUi5zaG93LCB2ZXJ0ZXgucmVjZWl2ZXIgPSB2ZXJ0ZXgucmVjZWl2ZXIpCm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNvciwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgcGFpckxSLnVzZSA9IExSLnNob3csIGxheW91dCA9ICJjaXJjbGUiKQpuZXRWaXN1YWxfaW5kaXZpZHVhbChjb3IsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIHBhaXJMUi51c2UgPSBMUi5zaG93LCBsYXlvdXQgPSAiY2hvcmQiKQoKCm5ldFZpc3VhbF9idWJibGUoY29yLCBzb3VyY2VzLnVzZSA9IDgsIHRhcmdldHMudXNlID0gYygyLDMsNiw3LDEzKSwgcmVtb3ZlLmlzb2xhdGUgPSBGQUxTRSkgI1RfY2VsbDIg5L2c5Li6c291cmNlCiMgbmV0VmlzdWFsX2J1YmJsZShjb3IsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDE6NyksIHJlbW92ZS5pc29sYXRlID0gRkFMU0UpICNzdHJvbWFsIOS9nOS4unNvdXJjZQoKbmV0VmlzdWFsX2J1YmJsZShjb3IsIHNvdXJjZXMudXNlID0gNSwgdGFyZ2V0cy51c2UgPSBjKDIsMyw2LDcsMTMpLCBzaWduYWxpbmcgPSBjKCJUTkYiKSwgcmVtb3ZlLmlzb2xhdGUgPSBGQUxTRSkKYGBgCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ3RybCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLgoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgo=